home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
language
/
pcl_src.zoo
/
gcl-patches.lsp
< prev
next >
Wrap
Lisp/Scheme
|
1992-07-09
|
6KB
|
169 lines
;;; -*- Mode:Lisp; Package:USER; Base:10; Syntax:Common-lisp -*-
(in-package 'user)
(setq c::optimize-speed 3)
(setq c::optimize-safety 0)
(setq c::optimize-space 0)
(remprop 'macroexpand 'c::fdesc)
(remprop 'macroexpand-1 'c::fdesc)
;;; this is here to fix the printer so it will find the print
;;; functions on structures that have 'em.
(in-package 'lisp)
(defun %write-structure (struct output-stream print-vars level)
(let* ((name (svref struct 0))
(pfun (or (let ((temp (get name 'structure-descriptor)))
(and temp (dd-print-function temp)))
(get name :print-function))))
(declare (symbol name))
(cond
(pfun
(funcall pfun struct output-stream level))
((and (pv-level print-vars) (>= level (pv-level print-vars)))
(write-char #\# output-stream))
((and (pv-circle print-vars)
(%write-circle struct output-stream (pv-circle print-vars))))
(t
(let ((pv-length (pv-length print-vars))
(pv-pretty (pv-pretty print-vars)))
(when pv-pretty
(pp-push-level pv-pretty))
(incf level)
(write-string "#s(" output-stream)
(cond
((and pv-length (>= 0 pv-length))
(write-string "..."))
(t
(%write-symbol name output-stream print-vars)
(do ((i 0 (1+ i))
(n 0)
(slots (dd-slots (get name 'structure-descriptor))
(rest slots)))
((endp slots))
(declare (fixnum i n) (list slots))
(when pv-pretty
(pp-insert-break pv-pretty *structure-keyword-slot-spec* t))
(write-char #\space output-stream)
(when (and pv-length (>= (incf n) pv-length))
(write-string "..." output-stream)
(return))
(write-char #\: output-stream)
(%write-symbol-name
(symbol-name (dsd-name (first slots))) output-stream print-vars)
(when pv-pretty
(pp-insert-break pv-pretty *structure-data-slot-spec* nil))
(write-char #\space output-stream)
(when (and pv-length (>= (incf n) pv-length))
(write-string "..." output-stream)
(return))
(%write-object
(svref struct (dsd-index (first slots)))
output-stream print-vars level))))
(write-char #\) output-stream)
(when pv-pretty
(pp-pop-level pv-pretty)))))))
(eval-when (eval) (compile '%write-structure))
;;;
;;; Apparently, whoever implemented the TIME macro didn't consider that
;;; someone might want to use it in a non-null lexical environment. Of
;;; course this fix is a loser since it binds a whole mess of variables
;;; around the evaluation of form, but it will do for now.
;;;
(in-package 'lisp)
(DEFmacro TIME (FORM)
`(LET (IGNORE START FINISH S-HSEC F-HSEC S-SEC F-SEC S-MIN F-MIN VALS)
(FORMAT *trace-output* "~&Evaluating: ~A" ,form)
;; read the start time.
(MULTIPLE-VALUE-SETQ (IGNORE IGNORE IGNORE S-MIN START)
(SYS::%SYSINT #X21 #X2C00 0 0 0))
;; Eval the form.
(SETQ VALS (MULTIPLE-VALUE-LIST (progn ,form)))
;; Read the end time.
(MULTIPLE-VALUE-SETQ (IGNORE IGNORE IGNORE F-MIN FINISH)
(SYS::%SYSINT #X21 #X2C00 0 0 0))
;; Unpack start and end times.
(SETQ S-HSEC (LOGAND START #X0FF)
F-HSEC (LOGAND FINISH #X0FF)
S-SEC (LSH START -8)
F-SEC (LSH FINISH -8)
S-MIN (LOGAND #X0FF S-MIN)
F-MIN (LOGAND #X0FF F-MIN))
(SETQ F-HSEC (- F-HSEC S-HSEC)) ; calc hundreths
(IF (MINUSP F-HSEC)
(SETQ F-HSEC (+ F-HSEC 100)
F-SEC (1- F-SEC)))
(SETQ F-SEC (- F-SEC S-SEC)) ; calc seconds
(IF (MINUSP F-SEC)
(SETQ F-SEC (+ F-SEC 60)
F-MIN (1- F-MIN)))
(SETQ F-MIN (- F-MIN S-MIN)) ; calc minutes
(IF (MINUSP F-MIN) (INCF F-MIN 60))
(FORMAT *trace-output* "~&Elapsed time: ~D:~:[~D~;0~D~].~:[~D~;0~D~]~%"
F-MIN (< F-SEC 10.) F-SEC (< F-HSEC 10) F-HSEC)
(VALUES-LIST VALS)))
;;;
;;; Patch to PROGV
;;;
(in-package sys::*compiler-package-load*)
;;; This is a fully portable (though not very efficient)
;;; implementation of PROGV as a macro. It does its own special
;;; binding (shallow binding) by saving the original values in a
;;; list, and marking things that were originally unbound.
(defun PORTABLE-PROGV-BIND (symbol old-vals place-holder)
(let ((val-to-save '#:value-to-save))
`(let ((,val-to-save (if (boundp ,symbol)
(symbol-value ,symbol)
,place-holder)))
(if ,old-vals
(rplacd (last ,old-vals) (ncons ,val-to-save))
(setq ,old-vals (ncons ,val-to-save))))))
(defun PORTABLE-PROGV-UNBIND (symbol old-vals place-holder)
(let ((val-to-restore '#:value-to-restore))
`(let ((,val-to-restore (pop ,old-vals)))
(if (eq ,val-to-restore ,place-holder)
(makunbound ,symbol)
(setf (symbol-value ,symbol) ,val-to-restore)))))
(deftransform PROGV PORTABLE-PROGV-TRANSFORM
(symbols-form values-form &rest body)
(let ((symbols-lst '#:symbols-list)
(values-lst '#:values-list)
(syms '#:symbols)
(vals '#:values)
(sym '#:symbol)
(old-vals '#:old-values)
(unbound-holder ''#:unbound-holder))
`(let ((,symbols-lst ,symbols-form)
(,values-lst ,values-form)
(,old-vals nil))
(unless (and (listp ,symbols-lst) (listp ,values-lst))
(error "PROGV: Both symbols and values must be lists"))
(unwind-protect
(do ((,syms ,symbols-lst (cdr ,syms))
(,vals ,values-lst (cdr ,vals))
(,sym nil))
((null ,syms) (progn ,@body))
(setq ,sym (car ,syms))
(if (symbolp ,sym)
,(PORTABLE-PROGV-BIND sym old-vals unbound-holder)
(error "PROGV: Object to be bound not a symbol: ~S" ,sym))
(if ,vals
(setf (symbol-value ,sym) (first ,vals))
(makunbound ,sym)))
(dolist (,sym ,symbols-lst)
,(PORTABLE-PROGV-UNBIND sym old-vals unbound-holder))))))